package com.itbaiazhan.myes2.repository;

import com.itbaiazhan.myes2.document.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

//ElasticsearchRepository<实体类，实体类的主键类型>
public interface ProductRepository extends ElasticsearchRepository<Product,Integer>{


    /*接下来我们讲解SpringDataES支持的查询方式，
    * query后的json对象称为DSL语句，我们可以在接口方法上使用@Query注解自定义DSL语句查询。*/
    //根据关键词搜索
    //?0 代表占位符  即是代表keyword
    //自动识别一个错别字
    @Query("{" +
            " \"match\": {" +
            "  \"productDesc\": {" +
            "   \"query\": \"?0\"," +
            "   \"fuzziness\": 1" +
            "  }" +
            " }" +
            "  }")
    List<Product> findByProductDescFuzzy(String keyword);


    @Query("{" +
            "   \"match\": {" +
            "    \"productDesc\": \"?0\"" +
            "   }" +
            "  }")
    List<Product> findByProductDescMatch(String keyword);

    //按照规则命名方法进行查询

    List<Product> findByProductName(String productName);

    List<Product> findByProductNameOrProductDesc(String productName,String productDesc);

    List<Product> findByIdBetween(Integer a,Integer b);

    //分页查询  重载方法
    @Query("{" +
            "   \"match\": {" +
            "    \"productDesc\": \"?0\"" +
            "   }" +
            "  }")
    Page<Product> findByProductDescMatch(String keyword, Pageable page);
}

/*按照规则命名方法进行查询
*
* 只需在Repository接口中按照SpringDataES的规则命名方法，该方法就能完成相应的查询。
规则：查询方法以findBy开头，涉及查询条件时，条件的属性用条件关键字连接。
*
关键字	   命名规则	                    解释	                            示例
and	   ﬁndByField1AndField2	    根据Field1和Field2 获得数据	ﬁndByTitleAndContent
or	   ﬁndByField1OrField2	   根据Field1或Field2 获得数据	     ﬁndByTitleOrContent
is	    ﬁndByField	            根据Field获得数据	                    ﬁndByTitle
not	    ﬁndByFieldNot	        根据Field获得补集数据	            ﬁndByTitleNot
between	  ﬁndByFieldBetween	    获得指定范围的数据	            ﬁndByPriceBetween
*
*
List<Product> findByProductName(String productName);
List<Product> findByProductNameOrProductDesc(String productName,String productDesc);
List<Product> findByIdBetween(Integer startId,Integer endId);
*
*
实时学习反馈
1. 在Spring Data ElasticSearch中，按照规则命名方法进行查询，方法名以开头

A find

B search

C query

D findBy

答案
1=>D*/
